/*
 * @Author: 曹捷
 * @Date: 2020-06-19 11:37:11
 * @LastEditors: 曹捷
 * @LastEditTime: 2021-03-07 21:19:35
 * @Description: 自定义校验规则
 * 
 */
import {show} from '@/app-modules/utils'

export default {
  data () {
    return {
      // demo展示
      // params: {
      //     oldPsw: '',
      //     newPsw: '',
      //     pswAgain: ''
      // },
      // rules: {
      //     oldPsw: [{ required: true, message: '请输入当前密码' }],
      //     newPsw: [
      //         { required: true, message: '请输入新密码' },
      //         { min: 6, max: 20, message: '密码长度必须在6-20个字符以内' },
      //         { validator: validatorPsw }
      //     ],
      // list 子集也可以校验
      // 校验allot_list 每一个对象里面的demand_count值的情况 格式必须是 type :list;key:''(要校验的子对象值);child:[] (子集校验规则List);
      // allot_list: [{
      //   type: 'list',
      //   key: 'demand_count',
      //   child: [
      //     { required: true, name: '实际出库' },
      //     { validator: validatorCount },
      //   ]
      // }],
      //     pswAgain: [
      //         { required: true, message: '请输入二次密码' },
      //         {
      //             min: 6,
      //             max: 20,
      //             message: '再次输入的密码长度必须在6-20个字符以内'
      //         },
      //         { validator: validatorPsw }
      //     ]
      // }
    }
  },
  methods: {
    /**
     * @param {*} params
     * 需要校验的参数
     * @param {*} rules
     * 校验规则
     * @param {*} showInfo
     * Boolean 是否直接弹出错误提示
     */
    validate (params, rules, showInfo = true) {
      for (let i in rules) {
        let rule = rules[i]
        let content = params[i]
        // 增加自定义错误类
        let dom = document.querySelector(`[obit-prop=${i}]`)
        if (!this.validateItem(content, rule, showInfo)) {
          if (dom) {
            dom.classList.add('obit-error')
          }
          return false
        } else {
          if (dom) {
            dom.classList.remove('obit-error')
          }
        }
      }
      return true
    },
    /**
     *
     * @param {*} content
     * 需要校验的数值
     * @param {*} rule
     * 校验规则
     * @param {*} showInfo
     * Boolean 是否直接弹出错误提示
     */
    validateItem (content, rule, showInfo = true, itemParams = {}) {
      for (let it in rule) {
        let item = rule[it]
        let validIsFun = Object.prototype.toString.call(item.validator).indexOf('Function') !== -1
        if (item.required && (content === null || content === '' || content === undefined ||
          content === false || (content instanceof Array && content.length === 0))) {
          let info = item.message ? item.message : '不能为空'
          info = `${item.name ? item.name : ''}${info}`
          this.showToast(info, showInfo)
          return false
        }
        if (item.type === 'number' && content && isNaN(content)) {
          let info = item.message ? item.message : '不是正确的数字'
          info = `${item.name ? item.name : ''}${info}`
          this.showToast(info, showInfo)
          return false
        }
        if (item.type === 'list' && content && item.child) {
          let res = this.validateList(item, content, showInfo)
          if (!res) {
            return false
          }
        }
        if (item.type === 'email' && content && !/^([a-zA-Z]|[0-9])(\w|\-)+@[a-zA-Z0-9]+\.([a-zA-Z]{2,4})$/.test(content)) {
          let info = item.message ? item.message : '邮箱格式不正确'
          info = `${item.name ? item.name : ''}${info}`
          this.showToast(info, showInfo)
          return false
        }
        if (item.type === 'decimalTwo' && !/^(([1-9]{1}\d*)|([0]{1}))(\.(\d){0,2})?$/.test(content)) {
          let info = item.message ? item.message : '最多保留两位小数'
          info = `${item.name ? item.name : ''}${info}`
          this.showToast(info, showInfo)
          return false
        }
        if (item.type === 'decimalThree' && !/^(([1-9]{1}\d*)|([0]{1}))(\.(\d){0,3})?$/.test(content)) {
          let info = item.message ? item.message : '最多保留三位小数'
          info = `${item.name ? item.name : ''}${info}`
          this.showToast(info, showInfo)
          return false
        }
        if (item.type === 'phone' && content && !/^1(3|4|5|6|7|8|9)\d{9}$/.test(content)) {
          let info = item.message ? item.message : '不是正确的手机号码'
          info = `${item.name ? item.name : ''}${info}`
          this.showToast(info, showInfo)
          return false
        }
        let carRule = /^[京津晋冀蒙辽吉黑沪苏浙皖闽赣鲁豫鄂湘粤桂琼渝川贵云藏陕甘青宁新]\S[\S\d]{5,6}$/

        if (item.type === 'car' && content && !carRule.test(content)) {
          let info = item.message ? item.message : '格式不正确'
          info = `${item.name ? item.name : ''}${info}`
          this.showToast(info, showInfo)
          return false
        }
        if (item.min && content.length < item.min) {
          let info = item.message ? item.message : `内容不能少于${item.min}个字符`
          info = `${item.name ? item.name : ''}${info}`
          this.showToast(info, showInfo)
          return false
        }
        if (item.max && content.length > item.max) {
          let info = item.message ? item.message : `内容不能超过${item.max}个字符`
          info = `${item.name ? item.name : ''}${info}`
          this.showToast(info, showInfo)
          return false
        }
        if (item.maxValue && content > item.maxValue) {
          let info = item.message ? item.message : `内容不能超过${item.maxValue}`
          info = `${item.name ? item.name : ''}${info}`
          this.showToast(info, showInfo)
          return false
        }
        if (item.minValue && content < item.minValue) {
          let info = item.message ? item.message : `内容不能小于${item.minValue}`
          info = `${item.name ? item.name : ''}${info}`
          this.showToast(info, showInfo)
          return false
        }
        //   自定义验证，返回飞空的提示内容 ，则代表需要有异常进行提示
        if (item.validator && validIsFun) {
          let res = item.validator(content, itemParams)
          if (Object.prototype.toString.call(res).indexOf('String') !== -1 && res !== '') {
            this.showToast(res, showInfo)
            return false
          }
        }
      }
      return true
    },
    /**
     * 校验list对象
     * @param {*} item 
     * {
          type: 'list',
          child: [
            { required: true, key: 'demand_count', name: '到岸时间' },
          ]
        }
     * @param {*} dataList 
     * [{demand_count:34,xxx:''}]
     */
    validateList (item, dataList, showInfo) {
      let rules = item.child
      for (let j in dataList) {
        let content = dataList[j][item.key]
        console.log('content: ', content, dataList[j]);
        if (!this.validateItem(content, rules, showInfo, dataList[j])) {
          return false
        }
      }
      return true

    },
    showToast (content, showInfo = true) {
      if (showInfo) {
        // 自定义的弹出框  如果有 使用自定义弹出框
        if (this.$refs.toast) {
          this.$refs.toast.open({ content })
        } else {
          show(`！${content}`)
        }
      }
    },
    // 调用方式  demo
    // submit() {
    //     let valide = this.validate(this.params, this.rules)
    //     if (valide) {
    //       this.showToast('验证成功')
    //     }
    //   }
  },
}
